Шаг 2. Просматриваем незакоммиченные изменения в одном файле

На самом деле мы будем не только просматривать, но и сравнивать изменения. И в этом нам поможет команда git diff.

Команда git diff используется, чтобы посмотреть изменения в том или ином коммите, а затем сравнить их между собой. Она полезна, ведь даже если текст коммита написан хорошо, сложно понять, что именно изменилось, а главное — на каких строчках.

Давайте изменим файл index.html: поменяем значение атрибута class у элемента <h1> с title на heading. Сохраним файл комбинацией клавиш Ctrl + S. А вот фиксировать изменение не будем, иначе мы не сможем посмотреть действие команды.

Красная стрелка указывает на изменённое значение атрибута class у элемента h1
Красная стрелка указывает на изменённое значение атрибута class у элемента h1

Затем перейдём в Git Bash и пропишем команду git diff index.html, чтобы посмотреть незакоммиченные изменения в файле index.html.

Введена команда git diff index.html
Введена команда git diff index.html

Появилось много непонятных строк и блок кода с изменениями. Давайте разбираться.

Минус, плюс и выделение цветом. Знаком минус - и красным цветом отмечена удалённая строка. Знаком плюс + и зелёным цветом — добавленная.

Пусть вас не смущает, что Git считает строку удалённой, если она на самом деле просто поменялась. Дело в том, что Git не может иначе отметить изменённый код. Поэтому сначала он красным цветом показывает часть до исправлений, а затем зелёным цветом отмечает изменённый фрагмент.

Так бывает не всегда. Если вы действительно удалили строчку, то изменения будут выделены только красным цветом. Если вы добавили дополнительную строку, Git отметит её только зелёным цветом.

Первая строка вывода — diff --git a/index.html b/index.html. Показывает, какой файл и с каким сравнивается. В нашем случае сравниваются:

  • файл под буквой a — index.html;
  • файл под буквой b — тоже index.html.

Но под этими буквами могут быть и совершенно разные файлы. Мы это увидим позже.

Красная стрелка указывает на строчку diff --git a/index.html b/index.html
Красная стрелка указывает на строчку diff --git a/index.html b/index.html

Строка с метаданными — index b2c4f83..f0f58e6 100644 — метаданные, которые используются в сравнении. Это кусок хэша b2c4f83 blob-объекта, который принадлежит файлу под буквой a — index.html.

Blob-объект, или blob-файл — бинарный файл, в котором содержатся имя файла (в нашем случае index) и его содержимое в сжатом виде. Такой бинарный файл находится в скрытой директории .git и её поддиректории objects.

Красная стрелка указывает на строчку index b2c4f83..f0f58e6 100644
Красная стрелка указывает на строчку index b2c4f83.f0f58e6 100644

Строки с изменениями — две строчки, которые можно объединить в одну группу: --- a/index.html и +++ b/index.html. Изменения в файле a будут отображаться со знаком минус -, а изменения в файле под буквой b будут отображаться со знаком плюс +.

Красная стрелка указывает на строчку --- a/index.html и +++ b/index.html
Красная стрелка указывает на строчку --- a/index.html и +++ b/index.html

Последняя строка — @@ -8,7 +8,7 @@. Такая запись называется заголовком блока сравнения — сам блок идёт ниже. Заголовок всегда начинается и заканчивается двумя символами AT — символом «собака».

В нашем заголовке сказано: начиная с восьмой строчки, было удалено семь строчек; начиная с восьмой строчки, было добавлено тоже семь строчек.

Скорее всего, сейчас у вас возник логичный вопрос: почему удалено и добавлено семь строк, если Git показал, что удалена и добавлена всего одна. Помимо удалённых и добавленных, есть ещё белые строки — это так называемые неизменённые строчки. Git считает ещё и их.

Проще говоря, Git сначала удаляет семь строк, включая одну удалённую, а затем вставляет белые строки на место и добавляет новую строчку.

Здесь у вас мог появиться другой вопрос: почему неизменённых строк так мало, ведь в файле index.html их гораздо больше? Всё просто. Нет смысла выводить все неизменённые строчки — хватит и части, чтобы показать, в какой области произошло изменение. Поэтому Git показывает по три неизменённых строчки до и после изменения.

Если изменений в файле много и между ними большое количество неизменённых строчек, то Git их пропустит и разобьёт изменения на небольшие блоки. А если между изменениями не так уж и много неизменённых строчек, то он выведет это изменения единым блоком.

Красная стрелка указывает на строчку @@ -8,7 +8,7 @@
Красная стрелка указывает на строчку @@ -8,7 +8,7 @@